Български

Разгледайте междинния софтуер на Next.js – мощна функционалност за прихващане и промяна на входящи заявки. Научете как да внедрите удостоверяване, оторизация, пренасочване и A/B тестване с практически примери.

Междинен софтуер (Middleware) в Next.js: Овладяване на прихващането на заявки за динамични приложения

Междинният софтуер (middleware) в Next.js предоставя гъвкав и мощен начин за прихващане и промяна на входящи заявки, преди те да достигнат до вашите маршрути. Тази способност ви позволява да внедрявате широк спектър от функционалности, от удостоверяване и оторизация до пренасочване и A/B тестване, като същевременно оптимизирате производителността. Това подробно ръководство ще ви преведе през основните концепции на междинния софтуер на Next.js и ще демонстрира как да го използвате ефективно.

Какво е междинен софтуер (Middleware) в Next.js?

Междинният софтуер в Next.js е функция, която се изпълнява, преди заявката да бъде завършена. Той ви позволява да:

Функциите на междинния софтуер се дефинират във файла middleware.ts (или middleware.js) в основната директория на вашия проект. Те се изпълняват за всеки маршрут във вашето приложение или за конкретни маршрути въз основа на конфигурируеми matchers (съвпадения).

Ключови концепции и предимства

Обект Request

Обектът request предоставя достъп до информация за входящата заявка, включително:

Обект Response

Функциите на междинния софтуер връщат обект Response, за да контролират резултата от заявката. Можете да използвате следните отговори:

Matchers (Съвпадения)

Matchers ви позволяват да определите към кои маршрути трябва да се прилага вашият междинен софтуер. Можете да дефинирате matchers, като използвате регулярни изрази или шаблони на пътища. Това гарантира, че вашият междинен софтуер се изпълнява само когато е необходимо, подобрявайки производителността и намалявайки натоварването.

Edge Runtime

Междинният софтуер на Next.js се изпълнява в Edge Runtime, което е олекотена среда за изпълнение на JavaScript, която може да бъде разположена близо до вашите потребители. Тази близост минимизира латентността и подобрява цялостната производителност на вашето приложение, особено за глобално разпределени потребители. Edge Runtime е наличен в Edge Network на Vercel и други съвместими платформи. Edge Runtime има някои ограничения, по-специално използването на Node.js API.

Практически примери: Внедряване на функционалности с междинен софтуер

1. Удостоверяване (Authentication)

Междинният софтуер за удостоверяване може да се използва за защита на маршрути, които изискват потребителите да са влезли в системата. Ето пример как да се внедри удостоверяване с помощта на бисквитки:


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
 const token = request.cookies.get('auth_token');

 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/dashboard/:path*'],
}

Този междинен софтуер проверява за наличието на бисквитка auth_token. Ако бисквитката не бъде намерена, потребителят се пренасочва към страницата /login. config.matcher указва, че този междинен софтуер трябва да се изпълнява само за маршрути под /dashboard.

Глобална перспектива: Адаптирайте логиката за удостоверяване, за да поддържате различни методи (напр. OAuth, JWT) и се интегрирайте с различни доставчици на идентичност (напр. Google, Facebook, Azure AD), за да обслужвате потребители от различни региони.

2. Оторизация (Authorization)

Междинният софтуер за оторизация може да се използва за контрол на достъпа до ресурси въз основа на потребителски роли или разрешения. Например, може да имате администраторско табло, до което имат достъп само определени потребители.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export async function middleware(request: NextRequest) {
 const token = request.cookies.get('auth_token');

 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 // Пример: Извличане на потребителски роли от API (заменете с вашата реална логика)
 const userResponse = await fetch('https://api.example.com/userinfo', {
 headers: {
 Authorization: `Bearer ${token}`,
 },
 });
 const userData = await userResponse.json();

 if (userData.role !== 'admin') {
 return NextResponse.redirect(new URL('/unauthorized', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/admin/:path*'],
}

Този междинен софтуер извлича ролята на потребителя и проверява дали той има роля admin. Ако не, той се пренасочва към страница /unauthorized. Този пример използва фиктивна крайна точка на API. Заменете `https://api.example.com/userinfo` с действителната крайна точка на вашия сървър за удостоверяване.

Глобална перспектива: Имайте предвид разпоредбите за защита на данните (напр. GDPR, CCPA), когато обработвате потребителски данни. Внедрете подходящи мерки за сигурност, за да защитите чувствителна информация и да осигурите съответствие с местните закони.

3. Пренасочване (Redirection)

Междинният софтуер за пренасочване може да се използва за пренасочване на потребители въз основа на тяхното местоположение, език или други критерии. Например, може да пренасочите потребителите към локализирана версия на вашия уебсайт въз основа на техния IP адрес.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
 const country = request.geo?.country || 'US'; // По подразбиране US, ако геолокацията е неуспешна

 if (country === 'DE') {
 return NextResponse.redirect(new URL('/de', request.url))
 }

 if (country === 'FR') {
 return NextResponse.redirect(new URL('/fr', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/'],
}

Този междинен софтуер проверява държавата на потребителя въз основа на неговия IP адрес и го пренасочва към съответната локализирана версия на уебсайта (/de за Германия, /fr за Франция). Ако геолокацията е неуспешна, по подразбиране се използва американската версия. Имайте предвид, че това разчита на наличността на свойството geo (напр. при разполагане на Vercel).

Глобална перспектива: Уверете се, че вашият уебсайт поддържа множество езици и валути. Предоставете на потребителите възможност ръчно да изберат предпочитания от тях език или регион. Използвайте подходящи формати за дата и час за всяка локализация.

4. A/B Тестване

Междинният софтуер може да се използва за внедряване на A/B тестване чрез произволно разпределяне на потребители към различни варианти на страница и проследяване на тяхното поведение. Ето един опростен пример:


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

function getRandomVariant() {
 return Math.random() < 0.5 ? 'A' : 'B';
}

export function middleware(request: NextRequest) {
 let variant = request.cookies.get('variant')?.value;

 if (!variant) {
 variant = getRandomVariant();
 const response = NextResponse.next();
 response.cookies.set('variant', variant);
 return response;
 }

 if (variant === 'B') {
 return NextResponse.rewrite(new URL('/variant-b', request.url));
 }

 return NextResponse.next();
}

export const config = {
 matcher: ['/'],
}

Този междинен софтуер разпределя потребителите към вариант 'A' или 'B'. Ако потребителят все още няма бисквитка variant, такава се задава и присвоява на случаен принцип. Потребителите, разпределени към вариант 'B', се пренаписват към страницата /variant-b. След това ще проследите ефективността на всеки вариант, за да определите кой е по-ефективен.

Глобална перспектива: Вземете предвид културните различия при проектирането на A/B тестове. Това, което работи добре в един регион, може да не резонира с потребителите в друг. Уверете се, че вашата платформа за A/B тестване е в съответствие с разпоредбите за поверителност в различните региони.

5. Флагове на функционалности (Feature Flags)

Флаговете на функционалности ви позволяват да активирате или деактивирате функции във вашето приложение, без да разполагате нов код. Междинният софтуер може да се използва, за да определи дали потребител трябва да има достъп до конкретна функция въз основа на неговия потребителски идентификатор, местоположение или други критерии.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export async function middleware(request: NextRequest) {
 // Пример: Извличане на флагове на функционалности от API
 const featureFlagsResponse = await fetch('https://api.example.com/featureflags', {
 headers: {
 'X-User-Id': 'user123',
 },
 });
 const featureFlags = await featureFlagsResponse.json();

 if (featureFlags.new_feature_enabled) {
 // Активиране на новата функционалност
 return NextResponse.next();
 } else {
 // Деактивиране на новата функционалност (напр. пренасочване към алтернативна страница)
 return NextResponse.redirect(new URL('/alternative-page', request.url));
 }
}

export const config = {
 matcher: ['/new-feature'],
}

Този междинен софтуер извлича флагове на функционалности от API и проверява дали флагът new_feature_enabled е зададен. Ако е, потребителят може да получи достъп до страницата /new-feature. В противен случай той се пренасочва към /alternative-page.

Глобална перспектива: Използвайте флагове на функционалности, за да въвеждате постепенно нови функции за потребители в различни региони. Това ви позволява да наблюдавате производителността и да отстранявате всякакви проблеми, преди да пуснете функцията за по-широка аудитория. Също така, уверете се, че вашата система за флагове на функционалности се мащабира глобално и предоставя последователни резултати, независимо от местоположението на потребителя. Вземете предвид регионалните регулаторни ограничения за пускането на функции.

Разширени техники

Свързване на междинен софтуер (Chaining Middleware)

Можете да свържете няколко функции на междинен софтуер заедно, за да извършите поредица от операции върху заявка. Това може да бъде полезно за разбиване на сложна логика на по-малки и по-управляеми модули.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
 const response = NextResponse.next();

 // Първа функция на междинния софтуер
 const token = request.cookies.get('auth_token');
 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 // Втора функция на междинния софтуер
 response.headers.set('x-middleware-custom', 'value');

 return response;
}

export const config = {
 matcher: ['/dashboard/:path*'],
}

Този пример показва два междинни софтуера в един. Първият извършва удостоверяване, а вторият задава персонализиран хедър.

Използване на променливи на средата

Съхранявайте чувствителна информация, като API ключове и идентификационни данни за база данни, в променливи на средата, вместо да ги кодирате директно във вашите функции на междинен софтуер. Това подобрява сигурността и улеснява управлението на конфигурацията на вашето приложение.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

const API_KEY = process.env.API_KEY;

export async function middleware(request: NextRequest) {
 const response = await fetch('https://api.example.com/data', {
 headers: {
 'X-API-Key': API_KEY,
 },
 });

 // ...
}

export const config = {
 matcher: ['/data'],
}

В този пример API_KEY се извлича от променлива на средата.

Обработка на грешки

Внедрете стабилна обработка на грешки във вашите функции на междинен софтуер, за да предотвратите срив на приложението ви от неочаквани грешки. Използвайте блокове try...catch, за да прихващате изключения и да регистрирате грешките по подходящ начин.


// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export async function middleware(request: NextRequest) {
 try {
 const response = await fetch('https://api.example.com/data');
 // ...
 } catch (error) {
 console.error('Error fetching data:', error);
 return NextResponse.error(); // Или пренасочване към страница за грешка
 }
}

export const config = {
 matcher: ['/data'],
}

Добри практики

Отстраняване на често срещани проблеми

Заключение

Междинният софтуер на Next.js е мощен инструмент за изграждане на динамични и персонализирани уеб приложения. Чрез овладяване на прихващането на заявки можете да внедрите широк спектър от функционалности, от удостоверяване и оторизация до пренасочване и A/B тестване. Като следвате добрите практики, очертани в това ръководство, можете да използвате междинния софтуер на Next.js, за да създавате високопроизводителни, сигурни и мащабируеми приложения, които отговарят на нуждите на вашата глобална потребителска база. Прегърнете силата на междинния софтуер, за да отключите нови възможности във вашите проекти с Next.js и да предоставите изключителни потребителски изживявания.